import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class TypingGame {

    private static final Random random = new Random();
    private static final String[] WORDS = {"hello", "world", "java", "programming", "typing", "game", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog", "computer", "science", "keyboard", "speed", "challenge", "bonus", "special"};
    private static final int[] DIFFICULTIES = {30000, 20000, 10000}; // 毫秒为单位，分别对应简单、中等、困难
    private static int score = 0;
    private static int difficultyIndex = 0; // 难度级别索引  
    private static boolean hasSpecialSkill = false; // 是否有特殊技能  
    private static long specialSkillEndTime = 0; // 特殊技能有效结束时间

    // 假设我们有一个方法来检查是否应该触发随机事件
    private static boolean shouldTriggerRandomEvent() {
        return random.nextInt(100) < 10; // 10% 的概率触发
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("当前难度级别：" + (difficultyIndex + 1) + "/3");

            // 检查特殊技能是否生效  
            if (hasSpecialSkill && System.currentTimeMillis() < specialSkillEndTime) {
                System.out.println("特殊技能生效中，本轮将无视时间限制！");
            }

            // 随机选择一个单词，包含普通单词和奖励/特殊技能单词
            String word = WORDS[random.nextInt(WORDS.length)];

            int timeLimit = DIFFICULTIES[difficultyIndex];

            System.out.println("请在" + timeLimit / 1000 + "秒内输入以下单词: " + word);

            long startTime = System.currentTimeMillis();
            String input = "";
            while (System.currentTimeMillis() - startTime < timeLimit || hasSpecialSkill && System.currentTimeMillis() < specialSkillEndTime) {
                if (scanner.hasNextLine()) {
                    input = scanner.nextLine().trim();
                    if (input.equalsIgnoreCase(word)) {
                        break;
                    }
                }
                try {
                    TimeUnit.MILLISECONDS.sleep(100); // 简单的延时  
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }

            long endTime = System.currentTimeMillis();

            if (endTime - startTime >= timeLimit && !hasSpecialSkill || !input.equalsIgnoreCase(word)) {
                if (!hasSpecialSkill) {
                    System.out.println("时间到！你没有完成输入或输入错误。");
                } else {
                    System.out.println("虽然特殊技能生效，但输入错误。");
                }

                // 难度降低  
                if (difficultyIndex > 0) {
                    difficultyIndex--;
                }
            } else {
                long duration = endTime - startTime;
                int baseScore = 10000 - (int) duration; // 基础分数

                // 奖励或特殊技能处理  
                if ("bonus".equalsIgnoreCase(word)) {
                    score += baseScore * 2; // 奖励分数加倍  
                    System.out.println("恭喜你！你找到了'bonus'单词，分数加倍！");
                } else if ("special".equalsIgnoreCase(word)) {
                    // 激活特殊技能，持续时间为10秒  
                    specialSkillEndTime = System.currentTimeMillis() + 10000;
                    hasSpecialSkill = true;
                    System.out.println("恭喜你！你找到了'special'单词，特殊技能已激活，持续10秒！");
                } else {
                    score += baseScore;
                }

                System.out.println("恭喜！你输入正确了。用时：" + duration + " 毫秒。得分：" + baseScore);

                // 根据用户表现调整难度  
                if (duration < timeLimit / 2) {
                    difficultyIndex = Math.min(difficultyIndex + 1, DIFFICULTIES.length - 1);
                }

                // 如果有特殊技能但本轮未使用，则不消耗技能  
                if (!"special".equalsIgnoreCase(word) && hasSpecialSkill) {
                    specialSkillEndTime = Math.max(specialSkillEndTime, System.currentTimeMillis());
                }
            }

            // 显示总分
            System.out.println("当前总分：" + score);

            // 询问玩家是否想继续游戏
            System.out.println("你想继续游戏吗？(yes/no)");
            String choice = scanner.nextLine().trim().toLowerCase();

            if (!"yes".equals(choice)) {
                System.out.println("游戏结束。你的最终得分为：" + score);
                break; // 退出循环，结束游戏
            }

            // 如果玩家选择了继续，并且当前有激活的特殊技能但已过期，则重置特殊技能状态
            if (hasSpecialSkill && System.currentTimeMillis() >= specialSkillEndTime) {
                hasSpecialSkill = false;
            }

            // 可以在这里添加更多的游戏逻辑，比如随机事件、成就系统等
            // ...

            // 在游戏循环的某个点调用此方法
            if (shouldTriggerRandomEvent()) {
                // 随机选择一个事件
                int eventType = random.nextInt(3);
                switch (eventType) {
                    case 0:
                        // 示例事件：难度突然增加
                        difficultyIndex = Math.min(difficultyIndex + 1, DIFFICULTIES.length - 1);
                        System.out.println("警告！游戏难度突然增加！");
                        break;
                    case 1:
                        // 示例事件：时间限制减半（但保持至少为500毫秒）
                        for (int i = 0; i < DIFFICULTIES.length; i++) {
                            DIFFICULTIES[i] = Math.max(DIFFICULTIES[i] / 2, 500);
                        }
                        System.out.println("特殊事件！本轮时间限制减半！");
                        break;
                    case 2:
                        // 示例事件：给予玩家额外分数
                        score += 1000;
                        System.out.println("恭喜！你遇到了幸运事件，获得了1000分额外奖励！");
                        break;
                    // 可以添加更多的事件类型
                }
            }

        }
    }
}